package br.com.view;

import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.stage.Stage;

/**
 * Esta classe herda de {@link Stage} e é responsável por personalizar o
 * {@link primaryStage} da classe {@link Principal#start(Stage)}.</br>
 * Toda a configuração necessária é feita aqui, mantendo a classe
 * {@link Principal} o mais limpa possível.
 * 
 * @author Adam
 * @since 30/07/2014
 * @see Group
 * @see Scene
 */
public class Palco extends Stage {

	private static ObservableValue<Number> largura;
	private static ObservableValue<Number> altura;
	private static Scene cena;
	private Group grupoRaiz = new Group();

	/**
	 * O construtor padrão desta classe instancia um palco parametrizado,
	 * contendo o css, o título, o ícone e solicita a implementação de um
	 * listener para o redimensionamento da cena.
	 * 
	 * @author Adam
	 * @since 30/07/2014
	 * @see Group
	 * @see Scene
	 */
	public Palco() {

		cena = new Scene(grupoRaiz);
		this.setScene(cena);
		cena.getStylesheets().add("css/adam.css");
		this.getIcons().add(new Image("img/bd.png"));
		this.setTitle("Banco de Dados P40");
		redimensionamento();

	}

	public Group getGrupoRaiz() {
		return grupoRaiz;
	}

	/**
	 * O método adiciona um listener para a propriedade {@link Scene cena}, que
	 * faz com que
	 * ele e todos os {@link javafx.scene.Node Nodes} dentro dele sejam
	 * redimensionados.</br>
	 * Este método faz a classe mudar suas dimensões em resposta às dimensões da
	 * cena.
	 * 
	 * @author Adam
	 * @since 30/07/2014
	 * @see Group
	 * @see Scene
	 */

	// Adicionando listener para a largura da tela
	private static void redimensionamento() {
		cena.widthProperty().addListener(new ChangeListener<Number>() {

			@SuppressWarnings("unchecked")
			@Override
			public void changed(ObservableValue<? extends Number> observable,
					Number oldValue, Number newValue) {
				Palco.altura = (ObservableValue<Number>) observable;

			}
		});

		// Adicionando listener para a altura da tela
		cena.heightProperty().addListener(new ChangeListener<Number>() {

			@SuppressWarnings("unchecked")
			@Override
			public void changed(ObservableValue<? extends Number> observable,
					Number oldValue, Number newValue) {
				Palco.largura = (ObservableValue<Number>) observable;

			}
		});
	}

	/**
	 * Este método recebe o valor da largura do palco.
	 * 
	 * @return - Retorna um objeto {@link Number Number} que pode ter seu valor
	 *         observado por uma outra classe quando a largura do palco é
	 *         modificada.
	 * @see ObservableValue
	 */
	public static ObservableValue<Number> getLargura() {
		return largura;
	}

	/**
	 * Este método recebe o valor da altura do palco.
	 * 
	 * @return - Retorna um objeto {@link Number Number} que pode ter seu valor
	 *         observado por uma outra quando a altura do palco é modificada.
	 * @see ObservableValue
	 */
	public static ObservableValue<Number> getAltura() {
		return altura;
	}

}
